home *** CD-ROM | disk | FTP | other *** search
- {$x+}
-
- unit dosfile;
-
- interface
-
- var
- ferror : word;
- {
- DOS error
- }
-
-
- function fopen(name : string; mode : char) : word;
- {
- name - filename (with path), mode - r - read, w - write, + - r/w,
- a - append.
- return: handle or $ffff if error
- If file opened for write or append and don't exist, then create it
- If file opened for write, truncated it to pos 0
- }
-
- function fclose(handle : word) : boolean;
- {
- Close file. If error then return FALSE
- }
-
- function fseek(handle : word; offset : longint; mode : byte) : boolean;
- {
- Seek file pointer to offset bytes
- mode 0 - from begin 1 - from current 2 - from end
- }
-
- function fread(handle, count : word; dest : pointer) : boolean;
- {
- Read count bytes to dest buffer
- }
-
- function fwrite(handle, count : word; sourc : pointer) : boolean;
- {
- Write count bytes from sourc buffer
- }
-
- function fflush(handle : word) : boolean;
- {
- Flush file
- }
-
- implementation
-
- function fopen;
- var
- asciiz : array[0..255] of char;
- i, acs : byte;
- nptr : pointer;
- hnd : word;
- begin
- for i := 0 to ord(name[0]) do asciiz[i] := name[i+1];
- asciiz[ord(name[0])] := #0;
- nptr := @asciiz;
- ferror := 0;
- case mode of
- 'r' : acs := 0;
- 'w' : acs := 1;
- '+' : acs := 2;
- 'a' : acs := 1;
- end;
- asm
- cmp mode, 'w'
- je @trunc
- push ds
- push dx
- mov ah, 3Dh
- mov al, acs
- lds dx, nptr
- int 21h
- pop dx
- pop ds
- jnc @noerr
- cmp mode, 'a'
- jne @err
- cmp ax, 0002h
- jne @err
- @trunc:
- push ds
- push dx
- push cx
- xor cx, cx
- mov ah, 3Ch
- lds dx, nptr
- int 21h
- pop cx
- pop dx
- pop ds
- jnc @noerr
- @err:
- mov ferror, ax
- mov ax, 0FFFFh
- @noerr:
- mov hnd, ax
- end;
- if (mode = 'a') and (ferror = 0) then fseek(hnd, 0, 2);
- fopen := hnd;
- end;
-
- function fclose; assembler;
- asm
- push bx
- mov ferror, 0
- mov bx, handle
- mov ah, 3Eh
- int 21h
- mov bx, ax
- mov ax, 01h
- jnc @noerr
- mov ferror, bx
- xor ax, ax
- @noerr:
- pop bx
- end;
-
- function fseek;
- type
- tlong = record
- case boolean of
- true : (long : longint);
- false : (lword, hword : word);
- end;
- var
- offs : tlong;
- begin
- offs.long := offset;
- ferror := 0;
- asm
- push bx
- push cx
- push dx
- mov ah, 42h
- mov al, mode
- mov bx, handle
- mov cx, offs.hword
- mov dx, offs.lword
- int 21h
- jnc @noerr
- mov ferror, ax
- @noerr:
- pop dx
- pop cx
- pop bx
- end;
- if ferror = 0 then fseek := true
- else fseek := false;
- end;
-
- function fread; assembler;
- asm
- push bx
- push cx
- push dx
- push ds
- mov ferror, 0
- mov ah, 3Fh
- mov bx, handle
- mov cx, count
- lds dx, dest
- int 21h
- pop ds
- jnc @noerr
- mov ferror, ax
- xor ax, ax
- @noerr:
- pop dx
- pop cx
- pop bx
- end;
-
- function fwrite; assembler;
- asm
- push bx
- push cx
- push dx
- push ds
- mov ferror, 0
- mov ah, 40h
- mov bx, handle
- mov cx, count
- lds dx, sourc
- int 21h
- pop ds
- jnc @noerr
- mov ferror, ax
- xor ax, ax
- @noerr:
- pop dx
- pop cx
- pop bx
- end;
-
- function fflush; assembler;
- asm
- push bx
- mov ferror, 0
- mov ah, 68h
- mov bx, handle
- int 21h
- mov bx, ax
- mov ax, 0001h
- jnc @noerr
- mov ferror, bx
- xor ax, ax
- @noerr:
- pop bx
- end;
- end.